#include <iostream>
#include <sstream>
#include <stdio.h>

#include "../../Clave/Clave.h"
#include "../../Clave/ClaveChar.h"
#include "../../Clave/ClaveInt.h"
#include "../../Util/Util.h"
#include "../../Dato/Dato.h"
#include "../../Dato/DatoNodoInterno.h"
#include "../../Util/Configuracion.h"
#include "../../Dato/DatoChar.h"

using namespace std;

#define TAM_TDATO 4
#define TAM_TCLAVE 4

#define TAM_META_REG (TAM_TDATO + TAM_TCLAVE)

#ifndef REGISTROARBOL_H_
#define REGISTROARBOL_H_

/*
 * Idea: encapsule el comportamiento de un registro de tamanio variable.
 * Registro: |_metadata_|_____________dato_____________|
 * Los datos de control o metadata son: un campo de longitud del dato de 4 bytes y otro
 * de clave de 4 bytes.
 */
class RegistroArbol {
public:

	RegistroArbol(Clave* clave, Dato* dato, char tipo);
	RegistroArbol(const RegistroArbol& registroArbol);
	RegistroArbol& operator=(const RegistroArbol& registro);
	RegistroArbol();

	/*
	 * Desserializa o hidrata a partir de un buffer stringstream (definido correctamente de la
	 * forma explicitada más arriba)
	 */
	RegistroArbol* crearRegistro(stringstream* fuente, char tipo);

	/*
	 * Serializa el registro.
	 */

	stringstream* toStream();
	/*
	 * Devuelve tamanio en bytes
	 */
	unsigned int getTamanio();

	Dato* getDato();

	void setDato(Dato& dato);

	Clave* getClave();

	char getTipo();

	void setClave(Clave& nuevaClave);

	virtual ~RegistroArbol();

private:
	Clave* clave;
	Dato* dato;
	char tipo;
};

#endif /* REGISTROARBOL_H_ */
